package main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup
var once sync.Once //结构体

//单向通道的使用
func f1(ch1 chan<- int) {
	defer wg.Done()
	for i := 0; i < 100; i++ {
		ch1 <- i
	}
	close(ch1)

}

//单向通道的使用
func f2(ch1 <-chan int, ch2 chan<- int) {
	defer wg.Done()
	for {
		x, ok := <-ch1
		if !ok {
			break
		}
		ch2 <- x * x
	}
	// close(ch2)
	once.Do(func() { close(ch2) }) //确保某个操作只执行一次
}

//关闭通道
func f3() {
	ch1 := make(chan int, 2)
	ch1 <- 12
	ch1 <- 14
	close(ch1)
	// x, ok := <-ch1
	// fmt.Println(x, ok)
	for ret := range ch1 {
		fmt.Println(ret)
	}
	<-ch1
	<-ch1
	y, oky := <-ch1
	fmt.Println(y, oky)
}

func main() {
	fmt.Println(`channel练习
	启动两个gorourtine，在main中打印取的值`)
	a := make(chan int, 100)
	b := make(chan int, 100)
	wg.Add(2)
	go f1(a)
	go f2(a, b)
	wg.Wait()
	for ret := range b {
		fmt.Println(ret)
	}
	//关闭通道
	f3()
}
